๐Ÿ”ฅFinal Project ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๊ธฐ

๐ŸKAKAO LOGIN

ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•œ ์ง€ ์ด์ œ 3์ฃผ ์ฐจ ๋ฅผ ๋„˜์–ด๊ฐ€๊ณ  ์žˆ๋‹ค.

์—ฌ๋Ÿฌ ํฌ๊ณ  ์ž‘์€ ์–ด๋ ค์›€๊ณผ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ๋‹ด์€ ์‚ฌํ•ญ์„ ๋งค์ผ ์ •๋ฆฌ ํ•˜๊ธฐ์—๋Š” CSS ์™€ ๊ธฐ๋Šฅ๊ตฌํ˜„์˜ ๋น ๋“ฏํ•จ(?)์ด ๋‚˜๋ฅผ ๊ทธ๋ฆฌ๊ณ  ๋‚ด ์Šค์Šค๋กœ๋ฅผ ๋งค์ผ๋งค์ผ ๋ชฐ์•„๋ถ™์˜€๊ธฐ์— ๋ธ”๋กœ๊ทธ๋ฅผ ์“ฐ์ง€ ๋ชปํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด ์นด์นด์˜ค ๋กœ๊ทธ์ธ์€ ๊ทธ๋ƒฅ ๋„˜๊ธธ ์ˆ˜ ์—†์–ด์„œ ๋ธ”๋กœ๊ทธ๋ฅผ ์จ์•ผ๋งŒ ํ•˜๊ฒ ๋‹ค.

๐Ÿšจ๊ณต์‹๋ฌธ์„œ ๋”ฐ๋ผ ํ•ด๋ณด๊ธฐ

์ž์„ธํ•œ ๊ณต์‹ ๋ฌธ์„œ์˜ ๋‚ด์šฉ์€

https://developers.kakao.com/docs/latest/ko/kakaologin/prerequisite

์— ์ž˜ ์†Œ๊ฐœ๋˜์–ด ์žˆ๋‹ค.

๊ณต์‹ ๋ฌธ์„œ์— ์žˆ๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€๊ฐ€ ๊ณผ์ •์„ ์ž˜ ์„ค๋ช…ํ•ด ์ฃผ๊ณ  ์žˆ๋‹ค.

๋น„๋ก ์‚ฝ์งˆ? ์„ ์กฐ๊ธˆ ์‹ฌํ•˜๊ฒŒ ํ–ˆ์ง€๋งŒ, ํ”„๋ก ํŠธ ์—”๋“œ์˜ ์ž…์žฅ์—์„œ ์นด์นด์˜ค ์„œ๋ฒ„์— ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ์š”์ฒญํ•˜๊ณ ,

๊ทธ ์ธ์ฆ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์„œ ๋ฐฑ์—”๋“œ์˜ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ์ด์ œ ๋ฐฑ์—”๋“œ ์—์„œ๋Š” ํ•ด๋‹น ์ธ์ฆ์ฝ”๋“œ๋กœ ์นด์นด์˜ค์— ํ† ํฐ์„ ์š”์ฒญํ•˜๊ณ ,

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ์ด์ œ ๋น„๋กœ์†Œ ์‘๋‹ต์œผ๋กœ accesstoken ๊ณผ refreshtoken ์„ ๋ฐ›๊ฒŒ ๋˜๊ณ  ํ† ํฐ ์œ ํšจ์„ฑ ํ™•์ธ์„ ํ†ตํ•ด

๋น„๋กœ์†Œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๊ฒŒ ๋˜๋Š” ๊ณผ์ •์ด๋‹ค.

1. ์‚ฝ์งˆ์˜ ๊ธฐ์–ต, Rest API vs SDK for JS

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ตฌํ˜„์„ ํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์€ ์ด๋ฏธ ์ง„ํ–‰๋˜์–ด์„œ ์•„๋ž˜ ๋งํฌ๋กœ ๋Œ€์‹ ํ•œ๋‹ค.

https://developers.kakao.com/docs/latest/ko/kakaologin/prerequisite

๋‚˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ SDK ๋ฅผ ์ด์šฉํ•œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด์„œ ์ง„ํ–‰ํ–ˆ๋‹ค.

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” โ€˜Rest API ๋ฅผ ์ด์šฉํ•œ ์นด์นด์˜ค ๋กœ๊ทธ์ธโ€™ ์˜ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด์„œ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ์˜€๋‹ค.

๋ฐฑ์—”๋“œ ๋ถ„๋“ค์ด ์—ด์‹ฌํžˆ ์„ค๋ช…ํ•ด ์ฃผ์…จ๋˜ ๊ฑฐ ๊ฐ™์€๋ฐ ์ œ๋Œ€๋กœ ๋“ฃ์ง€ ๋ชปํ–ˆ๋˜ ๊ฒŒ ์ผ๋‹จ ์ฒซ๋ฒˆ์งธ ์‚ฝ์งˆ์˜ ์‹œ์ž‘์ด ๋˜์—ˆ๋‹ค.

์—ฌํŠผ https://developers.kakao.com/docs/latest/ko/getting-started/sdk-js ๋งํฌ๋ฅผ ๋ณด๋ฉด์„œ

๋จผ์ € React ๋‚ด public ํด๋” ์•ˆ์— ์žˆ๋Š” index.html ๋‚ด head ํƒœ๊ทธ์— ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

<script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
<script>
  Kakao.init('939d6088cefbb5aaceb178768be8be0c')
  console.log(Kakao.isInitialized())
</script>

์ด๋ ‡๊ฒŒ ์‹œ์ž‘ํ–ˆ๋˜ ์ด์œ ๋ฅผ ๋‹ค์‹œ ๋– ์˜ฌ๋ ค ๋ณด๋‹ˆ๊นŒ, ๋‚˜๋Š” ์ด์ „์— ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•ด ๋ณธ์  ์ด ์žˆ์–ด์„œ์˜€๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ ๋•Œ๋Š” ๋‚ด๊ฐ€ ์ผ๋˜ Kakao SDK for JavaScript ๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฉ์‹ ์ด์˜€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ 

const loginWithKakao = () => {
  window.Kakao.Auth.login({
    success: authObj => {
      console.log(authObj)
      axios('http://localhost/users/kakao', {
        method: 'POST',
        headers: {
          Authorization: authObj.access_token,
        },
      })
        .then(res => res.json())
        .then(res => {
          if (res.token) {
            localStorage.setItem('CC_Token', res.token)
            console.log('๋กœ๊ทธ์ธ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')
            history.push('/')
          } else {
            console.log('๋‹ค์‹œ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.')
          }
        })
    },
    fail: function(err) {
      console.log('์—๋Ÿฌ', err)
    },
  })
}

onClick ์ด๋ฒคํŠธ๋กœ ๋งŒ๋“ค์–ด ๋†“์€ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์— loginWithKakao ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋ฉด ๊ทธ๋Œ€๋กœ ๋๋‚˜๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€๊ฐ€ ์•Š์•˜๋‹ค.

2. ์–ด์–ด? ๋กœ๊ทธ์ธ์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ? ์•ˆ๋˜๋„ค..

kakao login

์˜ค? ๋กœ๊ทธ์ธ ์ฐฝ์ด ๋œจ๋„ค? ์˜ค ๋˜๋‚˜๋ณด๋‹ค ํ•˜๊ณ  ๋ƒ…๋‹ค ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ดํ›„์— ์•„๋ฌด์ฐฝ๋„ ๋œจ์ง€ ์•Š์•˜๋‹ค.

axios ๋กœ ์„œ๋ฒ„ ์—”๋“œํฌ์ธํŠธ๋กœ ์š”์ฒญ์„ ํ–ˆ์œผ๋‹ˆ ์‘๋‹ต์ด ์˜ค๊ฑฐ๋‚˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์™€์•ผ ํ•˜๋Š”๋ฐ, ์ฝ˜์†” ๋กœ๊ทธ๋กœ ํ™•์ธํ•ด ๋ณด๋‹ˆ

์•„์˜ˆ ์‘๋‹ต ์ž์ฒด๊ฐ€ ๋˜์ง€ ์•Š์•˜๊ณ , ๋ฐฑ์—”๋“œ์—์„œ์˜ ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ req.query ๊ฐ€ ์ž˜ ๋ชป ๋˜์—ˆ๋‚˜ ์‹ถ์–ด์„œ req ๋กœ console.log ๋ฅผ ์ฐ์–ด์„œ

ํ•œ์ฐธ์„ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค.

์œ„์˜ ์ฝ”๋“œ ํฌ๋งท์—์„œ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ๋ญ”๊ฐ€๋ฅผ ์ˆ˜์ •ํ•˜๋‹ค ๋ณด๋‹ˆ๊นŒ 401 ์—๋Ÿฌ๊ฐ€ 400 ์—๋Ÿฌ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ–ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณด๋‚ธ access_token ์ด ์„œ๋ฒ„ ํ—ค๋”์˜ Authorization ์— ๋“ค์–ด๊ฐ€๊ธฐ๋„ ํ–ˆ๋‹ค.

error code

์—ฌํŠผ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ž˜๋ชป๋œ ์ ‘๊ทผ์ด์˜€์ง€๋งŒ,

https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting

์ธ๊ฐ€ ๊ด€๋ จ ์ฝ”๋“œ ์—๋Ÿฌ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋•๋ถ„์— ์ž˜ ๋ณด๊ณ  ์ฐพ์•„ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋Š” ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐค๋Šฆ๊ฒŒ (์‚ฌ์‹ค์€ ์ƒˆ๋ฒฝ) ํ•˜๋‹ค๊ฐ€ ์ง€์ณ ๋–จ์–ด์ ธ ๋‚˜๊ฐˆ ๋•Œ์ฏค ๋‚ด๊ฐ€ ์ง„ํ–‰ํ•œ ๋ฐฉ์‹์ด ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋А๊ผˆ๋‹ค.

ํŒ€ ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ํŒ€์›๋ถ„๊ป˜์„œ ์นœ์ ˆํžˆ ์„ค๋ช…ํ•ด ๋†“์€ ๊ธ€์„ ์ด ๋•Œ ๋ณด๊ณ  ํƒ„์‹์„ ํ–ˆ๋‹ค.

REST API ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์นด์นด์˜ค ๋กœ๊ทธ์ธ์ด์˜€์–ด์•ผ ํ–ˆ๋‹ค.

https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

์ด ๋งํฌ๋ฅผ ์œ„์ฃผ๋กœ ์ฐธ๊ณ ํ•ด์„œ ์ง„ํ–‰ํ–ˆ์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด๋ผ๋Š” ๋œป์ด์˜€๊ณ  ๋‚˜๋Š” ์ž๊พธ access_token ์„ ๋ณด๋‚ด๋ ค ํ–ˆ์ง€๋งŒ,

ํ† ํฐ์ด ์•„๋‹ˆ๋ผ ์นด์นด์˜ค ์„œ๋ฒ„์— โ€œ์ธ์ฆ ์ฝ”๋“œโ€ ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต์œผ๋กœ ๋ฐ›์•„์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ์ „๋‹ฌํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์˜€๋‹ค.

๐Ÿšจ๋ฐฑ์—”๋“œ ๋ถ„๋“ค๊ณผ ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ

https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=1234567890abcdefghijklmnopqrstuvw&redirect_uri=http://localhost:3000/signin

์œ„ ์ฝ”๋“œ์—์„œ client_id ๋Š” โ€˜๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ > ์•ฑ ์„ค์ • > ์•ฑ ํ‚คโ€™ ์— ์žˆ๋Š” REST API ํ‚ค ์ด๋‹ค.

ํŒ€์›๋ถ„๊ป˜์„œ ๊ฒ€์ƒ‰ํ•ด ๋ณด์…จ๋Š”๋ฐ, ํ•ด๋‹น ํ‚ค๋Š” ๊ณต๊ฐœ๊ฐ€ ๋˜์–ด๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ํ•œ๋‹ค.

๋ฌดํŠผ ์œ„์˜ ๋งํฌ๋ฅผ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ฉด ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธ์„ ํ•˜๊ณ  ๋‚˜๋ฉด,

localhost:3000/login?code=ASKDJASIN12231KNsakdasdl1210SSALadk5234

์œ„์™€ ๊ฐ™์ด ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€Œ๋Š”๋ฐ ๋ฐ”๋กœ ์ € code= ๋’ค์— ์žˆ๋Š” ๊ฒƒ๋“ค์ด โ€œ์ธ์ฆ ์ฝ”๋“œโ€ ์ด๋‹ค.

์Œ ๊ทธ๋Ÿผ ์ € ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ฌ๊นŒ?

1. window.location.href

window.location.href ๋Š” ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ €์˜ URI ์ฃผ์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

๋„ค์ดx ์—์„œ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์— window.location.href ๋ฅผ ์น˜๋ฉด ํ•ด๋‹น ์ฃผ์†Œ๊ฐ€ ๋‚˜์˜จ๋‹ค.

ํŒ€์› ๋ถ„๊ป˜์„œ ์นœ์ ˆํžˆ ์ฐพ์•„์ฃผ์…”์„œ ๊ทธ ์กด์žฌ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ์ถ”๊ฐ€ ๊ฒ€์ƒ‰์„ ํ•ด ๋ณด์•˜๋‹ค.

2. new URL()

https://developer.mozilla.org/ko/docs/Web/API/URL/URL

URL() ์ƒ์„ฑ์ž๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ œ๊ณตํ•œ URL์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒˆ๋กœ์šด URL ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ผ๊ณ  ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=1234567890abcdefghijklmnopqrstuvw&redirect_uri=http://localhost:3000/signin

์œ„ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ๋ณต์‚ฌํ•ด์„œ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ๋กœ๊ทธ์ธ ์ฐฝ์ด ๋‚˜์˜ค๊ณ , ํ•ด๋‹น ํ™”๋ฉด์—์„œ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ด์–ด

let requestURL = new URL(window.location.href)

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์„œ ํ™•์ธํ•ด ๋ณด๋ฉด ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

location href

์œ„์˜ ์ด๋ฏธ์ง€์—์„œ ๋ณด๋“ฏ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ํ™•์ธํ•ด ๋ณด์•˜์„ ๋•Œ, ์ด์ œ new URL ์ด๋ผ๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค ์—์„œ

โ€˜searchโ€™ ๋ผ๋Š” ํ‚ค์— ์ฃผ๋ชฉํ•ด์•ผ ํ•œ๋‹ค.

3. new URL() ์—์„œ search ํ‚ค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ค์ง€?

์ด์ œ ๋กœ๊ทธ์ธ์„ ํ•˜๊ณ  ๋‚œ ๋’ค ๋ฐ”๋€Œ๋Š” URL ์—์„œ โ€œ์ธ์ฆ ์ฝ”๋“œโ€ ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

new url

ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ ๋‚˜๋Š” split ์„ ์ƒ๊ฐํ•ด ๋ƒˆ๋‹ค.

new URL(window.location.href).search.split('=')[1]

๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํŒ€์›๋ถ„๊ป˜์„œ๋Š” ๋” ์ข‹์€ ์ œ์•ˆ์„ ํ•ด์ฃผ์…จ๋‹ค. ๊ทธ๊ฒƒ์€,

new URL(window.location.href).searchParams.get('code')

new URL ์ธ์Šคํ„ด์Šค์— ์ž์„ธํžˆ ๋ณด๋‹ˆ๊นŒ searchParams ๋ผ๋Š” ํ‚ค๊ฐ€ ์žˆ์—ˆ๊ณ , get(โ€˜codeโ€™) ๋ฅผ ํ†ตํ•ด code ๋’ค ๋ฌผ์Œํ‘œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋’ค์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด์˜€๋‹ค.

์˜คํ˜ธ ์ข‹์•˜์œผ! ์ด์ œ ๊ฐ€์ ธ์™”์œผ๋‹ˆ ๊ทธ๋Œ€๋กœ ์ด ์ฝ”๋“œ๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋ฉด ๋˜๊ฒ ๊ตฐ?

์•„๋‹ˆ.. ์•„์ง ํ•œ ๋ฐœ ๋” ๋‚จ์•˜๋‹ค.

4. ์ธ์ฆ ์ฝ”๋“œ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” Redirect URL ํ™•์ธ ๋ฐ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์„ค์ •.

์ผ๋‹จ ๋‚ด ๋ฆฌ์•กํŠธ์˜ ์ฝ”๋“œ๋Š” ๋กœ๊ทธ์ธ๊ณผ ํšŒ์›๊ฐ€์ž…, ์นด์นด์˜ค๋กœ๊ทธ์ธ์ด ๋ชจ๋‘ ์žˆ๋Š” SignInUp ์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๊ณ 

ํ•˜์œ„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ SignIn, SignUp ๋“ฑ์ด ์žˆ๋Š”๋ฐ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•˜๋Š” SocialLogin ์ปดํฌ๋„ŒํŠธ ๋˜ํ•œ ๋งŒ๋“ค์–ด์ ธ ์žˆ์—ˆ๋‹ค.

์ด ๋ถ€๋ถ„์ด ์•„์ง ๋ช…ํ™•ํžˆ ์ดํ•ด๊ฐ€ ๋˜์ง„ ์•Š์ง€๋งŒ,

์ž์‹ ์ปดํฌ๋„ŒํŠธ์ธ SocialLogin ์—์„œ axios ๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋„ฃ๋Š” ์‹œ๋„๋ฅผ ํ–ˆ์—ˆ๊ณ  ๋ถ„๋ช… ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์„œ ์ „๋‹ฌํ–ˆ๋Š”๋ฐ!

console.log ์—๋Š” ์ธ์ฆ ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ์ฐํžˆ์งˆ ์•Š์•˜๋‹ค.

์นด์นด์˜ค ๋””๋ฒจ๋กœํผ์— Redirect URL ์„ค์ •์„ SignInUp ์ปดํฌ๋„ŒํŠธ๋กœ ์—ฐ๊ฒฐ ๋˜๋Š” ์ฃผ์†Œ๋กœ ํ•ด๋‘์—ˆ๋‹ค.

http://localhost:3000/signin

redirect url

์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋ฉด Redirect URL ์ธ

// localhost:3000/signin
<Route path="/signin" component={SignInUp} />

๋กœ ์ด๋™๋˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ (๋ฆฌ์•กํŠธ์˜ SignInUp ์ปดํฌ๋„ŒํŠธ) ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ธ๋ฐ,

๋‚˜๋Š” ๊ณ„์† SignInUp ์ปดํฌ๋„ŒํŠธ์˜ ์ž์‹ ์š”์†Œ์ธ SocialLogin ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž๊พธ ์š”์ฒญ์„ ๋ณด๋‚ด๋‹ˆ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค /signin ์œผ๋กœ

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜๋Š”๋ฐ ์ธ์ฆ ์ฝ”๋“œ๊ฐ€ ์ฝ˜์†” ๋กœ๊ทธ์— ์ฐํž ๋ฆฌ๊ฐ€ ์—†์—ˆ๋‹ค.

5. ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” window.location.assign()

๊ทธ๋Ÿผ ์ด ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•ด ๋ณผ๊นŒ ํ•˜๋‹ค๊ฐ€ ํŒ€์› ๋ถ„๊ป˜์„œ window.location.assign() ์ด๋ผ๋Š” ๊ฒƒ์„ ์ฐพ์•„ ์ฃผ์…จ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ

window.location.assign(โ€http://www.google.comโ€) ์ด๋ผ๊ณ  ์น˜๋ฉด

๊ตฌ๊ธ€ ๋กœ ์ด๋™์ด ๋˜๋Š”, ์ฆ‰ ํ•ด๋‹น url ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œ์‹œํ‚ค๋Š” ์ฝ”๋“œ์ด๋‹ค.

SignInUp Component - SocialLogin ๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๊ณ„์ธต ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ์—์„œ

SocialLogin ์ปดํฌ๋„ŒํŠธ ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๊ณ ์ณค๋‹ค.

const SocialLogin = () => {
  const kakaoApi = `https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=1234567890abcdefghskldlasdlksalk&redirect_uri=http://localhost:3000/signin`

  const kakaoLoginHandler = () => {
    window.location.assign(kakaoApi)
  }

  return (
    <div className="social-login">
      <h1>Want Social Login?</h1>
      <button className="kakao-btn" type="button" onClick={kakaoLoginHandler}>
        <span className="btn-active">Login with kakao</span>
      </button>
    </div>
  )
}

์ž ์ด์ œ โ€˜Login with kakaoโ€™ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์•„๊นŒ ์šฐ๋ฆฌ๊ฐ€ ์ฃผ์†Œ์ฐฝ์— ์ฃผ์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•ด์„œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์ฐฝ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์ด ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐฑ์—”๋“œ์˜ API ๋กœ ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒƒ์€, ์นด์นด์˜ค ๋””๋ฒจ๋กœํผ์—์„œ ์„ค์ •ํ•œ Redirect URL ์ด ์œ„์น˜ํ•œ โ€œSignInUpโ€ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค!

6. SignInUp ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

๋น„๋™๊ธฐ์˜ Syntactic Sugar ์ธ async, await ์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•œ ์•„๋ž˜์˜ ์ฝ”๋“œ์ด๋‹ค.

์ด๋กœ์จ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

useEffect(async () => {
  const getAccessToken = async authorizationCode => {
    let tokenData = await axios
      .post('http://localhost:4000/users/kakao', {
        authorizationCode,
      })
      .then(res => {
        // console.log(res.data);
        let accessToken = res.data.accessToken
        let refreshToken = res.headers['refresh-token']
        localStorage.setItem('CC_Token', accessToken)
        localStorage.setItem('RF_Token', refreshToken)
        history.push(`/mypage`)
      })
  }
  const url = new URL(window.location.href)
  const authorizationCode = url.searchParams.get('code')
  // console.log('์ธ์ฆ ์ฝ”๋“œ', authorizationCode);
  if (authorizationCode) {
    await getAccessToken(authorizationCode)
  }
}, [])

7. ๋А๋‚€ ์ 

ํŒ€์› ๋ถ„๋“ค๊ณผ๋„ ์›Œ๋‚™ ์†Œํ†ต์ด ์ž˜ ๋œ๋‹ค๊ณ  ๋А๊ผˆ์ง€๋งŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ™์ด ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง„ํ–‰ ํ•  ๋•Œ ํŒ€์› ๋ถ„๋“ค์˜ ๋‚ด์šฉ์„ ์ž˜ ๊ท€๋‹ด์•„ ๋“ค์–ด์•ผ ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ถ„๋ช… ์‚ฝ์งˆ์ด ์žˆ์—ˆ๊ณ  ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ ์ˆœ๊ฐ„์ด ์žˆ์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ๋ฉด์— ๋Œ€ํ•ด ๋ฐฐ์›Œ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋˜ ์‹œ๊ฐ„์ด ๋˜์—ˆ๋˜ ๊ฑฐ ๊ฐ™๋‹ค.

๋˜ํ•œ ํ•ญ์ƒ ์–ด๋–ค ์ƒ๊ฐ์ด๋‚˜ ๊ณ„ํš์ด ํ•ญ์ƒ ๋‹ค ๋งž์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์—ผ๋‘์— ๋‘๊ณ  ๊นŠ์ด ๋“ค์–ด๊ฐ”์„ ๋•Œ ์Šค์Šค๋กœ ์ธ์ง€ํ•˜๊ณ  ๋น ์ ธ ๋‚˜์˜ฌ์ค„ ์•„๋Š” ์‹œ์•ผ ๋˜ํ•œ ๊ธธ๋Ÿฌ์•ผ ํ•  ๊ฑฐ ๊ฐ™๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ,

starbucks

์˜ค๋žœ๋งŒ์— ๋‹ฌ๋‹ฌํ•œ ์Œ๋ฃŒ๋ฅผ ๋ง›๋ณด๊ฒŒ ๋˜์–ด์„œ ๋„ˆ๋ฌด ์ข‹์•˜๋‹ค. ใ…Žใ…Ž ๋‹จ ๊ฑธ ๋จน์œผ๋‹ˆ๊นŒ ๋จธ๋ฆฌ๋„ ๋” ์ž˜ ๋Œ์•„๊ฐ€๋Š” ๋“ฏ ํ–ˆ๋‹ค!

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†๐Ÿ˜†


[DotoriMook]
Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook